PostgreSQL 自定义示例库
1 背景知识
本文主要介绍在测试场景中如何快速生成一些测试数据用于文档编写,性能测试,业务测试等。
2 快速生成数据
INSERT INTO t01 VALUES(generate_series(1,99999999));
CREATE TABLE t01 (id int, name varchar(50));
INSERT INTO t01 VALUEStext);
3 顺序数
例子,生成一批顺序值。
SELECT id FROM generate_series(1,10) t(id);
id
----
1
2
3
4
5
6
7
8
9
10
(10 rows)
4 随机数
random()
例子,生成一批随机整型
SELECT int FROM generate_series(1,10;
int4
------
14
82
25
75
4
75
26
87
84
22
(10 rows)
5 随机字符串
可以使用 md5text
生成一批随机字符串
select md5text) from generate_series(1,10;
md5
----------------------------------
ba1f4f4b0073f61145a821c14437230d
a76b09292c1449ebdccad39bcb5864c0
d58f5ebe43f631e7b5b82e070a05e929
0c0d3971205dc6bd355e9a60b29a4c6d
bd437e87fd904ed6ecc80ed782abac7d
71aea571d8c0cd536de53fd2be8dd461
e32e105db58f9d39245e3e2b27680812
174f491a2ec7a3498cab45d3ce8a4277
563a7c389722f746378987b9c4d9bede
6e8231c4b7d9a5cfaae2a3e0cef22f24
(10 rows)
6 重复字符串
可以使用 repeat(‘abc’, 10)
生成重复2次的随机字符串。
SELECT repeattext),2) FROM generate_series(1,10;
repeat
------------------------------------------------------------------
616d0a07a2b61cd923a14cb3bef06252616d0a07a2b61cd923a14cb3bef06252
73bc0d516a46182b484530f5e153085e73bc0d516a46182b484530f5e153085e
e745a65dbe0b4ef0d2a063487bbbe3d6e745a65dbe0b4ef0d2a063487bbbe3d6
90f9b8b18b3eb095f412e3651f0a946c90f9b8b18b3eb095f412e3651f0a946c
b300f78b20ac9a9534a46e9dfd488761b300f78b20ac9a9534a46e9dfd488761
a3d55c275f1e0f828c4e6863d4751d06a3d55c275f1e0f828c4e6863d4751d06
40e609dbe208fc66372b1c829018097140e609dbe208fc66372b1c8290180971
f661298e28403bc3005ac3aebae49e16f661298e28403bc3005ac3aebae49e16
10d0641e40164a238224d2e16a28764710d0641e40164a238224d2e16a287647
450e599890935df576e20c457691c421450e599890935df576e20c457691c421
(10 rows)
7 随机中文
create or replace function gen_hanzi(int) returns text as $
declare
res text;
begin
if $1 >=1 then
select string_aggint), '') into res from generate_series(1,$1;
return res;
end if;
return null;
end;
$ language plpgsql strict;
postgres=# select gen_hanzi(10) from generate_series(1,10);
gen_hanzi
----------------------
騾歵癮崪圚祯骤氾準赔
縬寱癱办戾薶窍爉充環
鷊赶輪肸蒹焷尮禀漽湯
庰槖诤蜞礀链惧珿憗腽
憭釃轮訞陡切瀰煈瘐獵
韸琵慆蝾啈響夐捶燚積
菥芉阣瀤樂潾敾糩镽礕
廂垅欳事鎤懯劑搯蔷窡
覤綊伱鳪散噹镄灳毯杸
鳀倯鰂錾牓晟挗觑镈壯
(10 rows)
8 随机数组
CREATE OR REPLACE FUNCTION gen_rand_arr(int,int) returns int[] as $
select array_aggint) from generate_series(1,$2;
$ language sql strict;
SELECT gen_rand_arr(100,10) FROM generate_series(1,10);
gen_rand_arr
---------------------------------
{69,11,12,70,7,41,81,95,83,17}
{26,79,20,21,64,64,51,90,38,38}
{3,64,46,28,26,55,39,12,69,76}
{66,38,87,78,8,94,18,88,89,1}
{6,14,81,26,36,45,90,87,35,28}
{25,38,91,71,67,17,26,5,29,95}
{82,94,32,69,72,40,63,90,29,51}
{91,34,66,72,60,1,17,50,88,51}
{77,13,89,69,84,56,86,10,61,14}
{5,43,8,38,11,80,78,74,70,6}
(10 rows)
9 连接符
postgres=# select concat('a', ' ', 'b');
//屏幕输出:
concat
--------
a b
(1 row)
10 自定义函数
通过自定义函数,可以生成很多有趣的数据。
11 随机身份证号
CREATE OR REPLACE FUNCTION gen_id(
a date,
b date
)
returns text as $
select lpadtext, 2, '0' ||
lpadtext, 2, '0' ||
lpadtext, 2, '0' ||
to_char(a + int, 'yyyymmdd' ||
lpadtext, 2, '0' ||
random()::int ||
(case when random()*10 >9 then 'X' else text end ;
$ language sql strict;
SELECT gen_id('1900-01-01', '2017-10-16') FROM generate_series(1,10);
gen_id
--------------------
25614020061108330X
49507919010403271X
96764619970119860X
915005193407306113
551360192005045415
430005192611170108
299138191310237806
95149919670723980X
542053198501097403
482334198309182411
(10 rows)
12 自我循环插入
DO LANGUAGE 'plpgsql' -- 指定匿名块的语言,可省略默认为plpgsql
$BODY$
BEGIN
for i in 1..8 loop
INSERT INTO t01 SELECT * FROM t01;
END loop;
END
$BODY$;